#include <string>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
#include <iostream>
#include <functional>
#include <iterator>
using namespace std;


//打印vector
template <typename T>
void print_v(vector<T> &v)
{
	for (vector<T>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
}

//打印list
template <typename T>
void print_l(list<T> &l)
{
	for (list<T>::iterator it = l.begin(); it != l.end(); it++)
	{
		cout << *it << " ";
	}
}

//函数(将元素+10)
template <typename T>
int increase(T &t)
{
	return t += 10;
}
//transform算法
void my_transform()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(4);
	//将元素+10
	transform(v.begin(), v.end(), v.begin(), increase<int>);
	print_v(v);

	//使用预定义的仿函数(函数对象)将元素取负值
	transform(v.begin(), v.end(), v.begin(), negate<int>());
	print_v(v);

	list<int> l; //双向链表
	l.resize(3);//指定大小
	//使用函数适配器 将元素乘10然后放到list中(v的元素不变)
	transform(v.begin(), v.end(), l.begin(), bind2nd(multiplies<int>(), 10));
	print_l(l);
	print_v(v);

	//取负值后接输出到屏幕 需要 引入<iterator>
	transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), negate<int>());
}

int main()
{
	my_transform();
	system("pause");
	return 0;
}